Java Technologies Practical উদাহরণ সহ @JsonManagedReference এবং @JsonBackReference গাইড ও নোট

323

Jackson এর @JsonManagedReference এবং @JsonBackReference অ্যানোটেশন দুটি Circular Reference সমস্যার সমাধান করতে ব্যবহৃত হয়, বিশেষত যখন এক ক্লাস অন্য ক্লাসের সাথে bi-directional relationship থাকে (যেমন Parent-Child)। এই অ্যানোটেশনগুলো একটি reference management সিস্টেম সরবরাহ করে, যা JSON Serialization এবং Deserialization-এর সময় circular references এড়াতে সাহায্য করে।


@JsonManagedReference এবং @JsonBackReference এর কার্যপদ্ধতি:

  • @JsonManagedReference: এটি Parent ক্লাসের সেই প্রপার্টি বা ফিল্ডে ব্যবহার করা হয়, যা child object রেফার করে।
  • @JsonBackReference: এটি Child ক্লাসের সেই প্রপার্টি বা ফিল্ডে ব্যবহার করা হয়, যা parent object রেফার করে।

@JsonManagedReference এবং @JsonBackReference একে অপরের সাথে কাজ করে যাতে একটি circular reference JSON Serialization-এর সময় ব্লক না হয়।


প্র্যাকটিক্যাল উদাহরণ:

১. Parent এবং Child ক্লাস

ধরা যাক, একটি Person (Parent) এবং Address (Child) ক্লাসের মধ্যে bi-directional relationship রয়েছে। Person ক্লাসের একটি Address ফিল্ড রয়েছে, এবং Address ক্লাসের একটি Person ফিল্ড রয়েছে।

Person ক্লাস (Parent):
import com.fasterxml.jackson.annotation.JsonManagedReference;

public class Person {
    private String name;
    private Address address;

    // Constructor
    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @JsonManagedReference
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}
Address ক্লাস (Child):
import com.fasterxml.jackson.annotation.JsonBackReference;

public class Address {
    private String street;
    private String city;
    private Person person;

    // Constructor
    public Address(String street, String city, Person person) {
        this.street = street;
        this.city = city;
        this.person = person;
    }

    // Getters and Setters
    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    @JsonBackReference
    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonManagedBackReferenceExample {
    public static void main(String[] args) throws Exception {
        // Address and Person Object Creation
        Person person = new Person("John Doe", new Address("123 Elm St", "Springfield", null));
        Address address = person.getAddress();
        address.setPerson(person);

        // Jackson ObjectMapper to convert to JSON
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(person);
        System.out.println("Serialized JSON: " + json);
    }
}
JSON Output:
{
  "name": "John Doe",
  "address": {
    "street": "123 Elm St",
    "city": "Springfield"
  }
}

ব্যাখ্যা:

  • এখানে, @JsonManagedReference এবং @JsonBackReference ব্যবহৃত হয়েছে Circular Reference সমস্যা প্রতিরোধ করার জন্য।
  • @JsonManagedReference Person ক্লাসে address ফিল্ডে ব্যবহার করা হয়েছে, যা child অবজেক্ট Address রেফার করে।
  • @JsonBackReference Address ক্লাসে person ফিল্ডে ব্যবহার করা হয়েছে, যা parent অবজেক্ট Person রেফার করে।
  • এইভাবে, address এবং person পরস্পরের মধ্যে সঠিকভাবে রেফারেন্সিং সম্পন্ন হলেও Circular Reference তৈরি হয়নি।

@JsonManagedReference এবং @JsonBackReference এর অন্যান্য ব্যবহারের উদাহরণ:

Multiple Child Objects

আপনি যদি একাধিক child objects নিয়ে কাজ করেন, তাও এই অ্যানোটেশন ব্যবহার করা যেতে পারে।

import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.util.List;

public class Department {
    private String name;

    @JsonManagedReference
    private List<Employee> employees;

    // Constructor, Getters, Setters
}

public class Employee {
    private String name;

    @JsonBackReference
    private Department department;

    // Constructor, Getters, Setters
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class DepartmentEmployeeExample {
    public static void main(String[] args) throws Exception {
        Department dept = new Department("HR", List.of(new Employee("John", null), new Employee("Jane", null)));
        dept.getEmployees().get(0).setDepartment(dept);
        dept.getEmployees().get(1).setDepartment(dept);

        // Jackson ObjectMapper to convert to JSON
        ObjectMapper objectMapper = new ObjectMapper();
        String json = objectMapper.writeValueAsString(dept);
        System.out.println("Serialized JSON: " + json);
    }
}

JSON Output:

{
  "name": "HR",
  "employees": [
    {
      "name": "John"
    },
    {
      "name": "Jane"
    }
  ]
}

@JsonManagedReference এবং @JsonBackReference এর সুবিধা:

  1. Circular Reference এড়ানো:
    • JSON Serialization এবং Deserialization-এর সময় Circular References থেকে সমস্যা এড়াতে সহায়তা করে।
  2. Bidirectional Relationships Handling:
    • Parent-Child রিলেশনশিপে সহজেই bi-directional reference manage করা যায়।
  3. Performance Optimization:
    • একটি reference কে flat JSON আউটপুটে পরিবর্তন করা হয়, ফলে মেমোরি ব্যবহারে সাশ্রয় হয় এবং পারফরম্যান্স উন্নত হয়।

  • @JsonManagedReference এবং @JsonBackReference দুটি অ্যানোটেশন একসাথে ব্যবহার করা হয় bi-directional relationships-এর Circular Reference সমস্যা সমাধান করার জন্য।
  • এগুলি parent-child সম্পর্কের মধ্যে ডেটা সিরিয়ালাইজেশনে সহজ ও কার্যকর উপায় প্রদান করে, যেখানে একে অপরকে রেফার করা হয়।
  • Jackson এর এই অ্যানোটেশন দুটি JSON প্রসেসিংকে আরও নিরাপদ, পরিষ্কার এবং কার্যকর করে তোলে।
Content added By
Promotion

Are you sure to start over?

Loading...